/*
****************************************************************************************************************
*= = 版权信息：Copyright (C) 356 - 999. Ombres Industry Empiral. All rights reserved.
*= = 文件名称：Ginkgo.cxx
*= = 功能描述：风之谷配置管理定义主文件
*= = 编写人员：Carlyon W. Tung
****************************************************************************************************************
*/

/*
*===============================================================================================================
*= = 声明文件
*===============================================================================================================
*/

#include <cstdio>
#include <iostream>
#include <string>

#include <tinyxml.h>

#include "Ginkgo.h"

/*
*===============================================================================================================
*= = 预处理声明
*===============================================================================================================
*/

#ifdef HAVE_CONFIG_H
    #include <config.h>
#endif // End of HAVE_CONFIG_H

/*
*===============================================================================================================
*= = 宏定义
*===============================================================================================================
*/

/*
*===============================================================================================================
*= = 命名空间
*===============================================================================================================
*/

using namespace Ginkgo;
using namespace std;

/*
*===============================================================================================================
*= = 类定义
*===============================================================================================================
*/

OGinkgo::OGinkgo()
{
    // TODO
}

OGinkgo::~OGinkgo()
{
    // TODO
}

OGinkgoHubris::OGinkgoHubris()
{
    // TODO
}

OGinkgoHubris::~OGinkgoHubris()
{
    // TODO
}

OGinkgoPostgreSQL::OGinkgoPostgreSQL()
{
	// TODO
}

OGinkgoPostgreSQL::~OGinkgoPostgreSQL()
{
	// TODO
}

bool OGinkgoPostgreSQL::set_config(std::string& xml)
{
    return pgsql_conf_xml.LoadFile(xml.c_str());
}

OOrality<std::string> OGinkgoPostgreSQL::get_hostaddress(void)
{
    TiXmlElement* root = pgsql_conf_xml.RootElement();

    if (nullptr == root)
    {
        m_hostaddress = OOrality<std::string>("127.0.0.1");
        return m_hostaddress;
    }

    TiXmlNode* node = root->FirstChild("hostaddress");

    if (nullptr == node)
    {
        m_hostaddress = OOrality<std::string>("127.0.0.1");
        return m_hostaddress;
    }

    const char* value = node->ToElement()->GetText();

    if (nullptr == value)
    {
        m_hostaddress = OOrality<std::string>("127.0.0.1");
    }
    else
    {
        m_hostaddress = OOrality<std::string>(value);
    }

    return m_hostaddress;
}

int OGinkgoPostgreSQL::get_port(void)
{
    TiXmlElement* root = pgsql_conf_xml.RootElement();

    if (nullptr == root)
    {
        return 5432;
    }

    TiXmlNode* node = root->FirstChild("port");

    if (nullptr == node)
    {
        return 5432;
    }

    const char* value = node->ToElement()->GetText();

    if (nullptr == value)
    {
        return 5432;
    }

    return std::atoi(value);
}

OOrality<std::string> OGinkgoPostgreSQL::get_dbname(void)
{
    TiXmlElement* root = pgsql_conf_xml.RootElement();

    if (nullptr == root)
    {
        m_dbname = OOrality<std::string>("Hubris");
        return m_dbname;
    }

    TiXmlNode* node = root->FirstChild("dbname");

    if (nullptr == node)
    {
        m_dbname = OOrality<std::string>("Hubris");
        return m_dbname;
    }

    const char* value = node->ToElement()->GetText();

    if (nullptr == value)
    {
        m_dbname = OOrality<std::string>("Hubris");
    }
    else
    {
        m_dbname = OOrality<std::string>(value);
    }

    return m_dbname;
}

OOrality<std::string> OGinkgoPostgreSQL::get_user(void)
{
    TiXmlElement* root = pgsql_conf_xml.RootElement();

    if (nullptr == root)
    {
        m_user = OOrality<std::string>("postgres");
        return m_user;
    }

    TiXmlNode* node = root->FirstChild("user");

    if (nullptr == node)
    {
        m_user = OOrality<std::string>("postgres");
        return m_user;
    }

    const char* value = node->ToElement()->GetText();

    if (nullptr == value)
    {
        m_user = OOrality<std::string>("postgres");
    }
    else
    {
        m_user = OOrality<std::string>(value);
    }

    return m_user;
}

OOrality<std::string> OGinkgoPostgreSQL::get_password(void)
{
    TiXmlElement* root = pgsql_conf_xml.RootElement();

    if (nullptr == root)
    {
        m_password = OOrality<std::string>("Windurb");
        return m_password;
    }

    TiXmlNode* node = root->FirstChild("password");

    if (nullptr == node)
    {
        m_password = OOrality<std::string>("Windurb");
        return m_password;
    }

    const char* value = node->ToElement()->GetText();

    if (nullptr == value)
    {
        m_password = OOrality<std::string>("Windurb");
    }
    else
    {
        m_password = OOrality<std::string>(value);
    }

    return m_password;
}

OOrality<std::string> OGinkgoPostgreSQL::get_version(void)
{
    m_version = OOrality<std::string>("15.0.5");
    return m_version;
}


/*
****************************************************************************************************************
*= = 文件结束
****************************************************************************************************************
*/


